package cn.edu.ncu.housinghub.mapper.message;

import cn.edu.ncu.housinghub.entity.message.SystemMessage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface SystemMessageMapper {
    
    /**
     * 保存系统消息
     * @param message 系统消息
     * @return 影响行数
     */
    int saveMessage(SystemMessage message);
    
    /**
     * 批量保存系统消息
     * @param messages 系统消息列表
     * @return 影响行数
     */
    int batchSaveMessages(@Param("messages") List<SystemMessage> messages);
    
    /**
     * 获取用户的系统消息列表
     * @param userId 用户ID
     * @param type 消息类型（可选）
     * @param offset 偏移量
     * @param pageSize 每页大小
     * @return 消息列表
     */
    List<SystemMessage> getUserMessages(@Param("userId") Long userId, 
                                       @Param("type") String type,
                                       @Param("offset") int offset, 
                                       @Param("pageSize") int pageSize);
    
    /**
     * 获取用户未读消息数量
     * @param userId 用户ID
     * @param type 消息类型（可选）
     * @return 未读数量
     */
    int getUnreadCount(@Param("userId") Long userId, @Param("type") String type);
    
    /**
     * 标记消息为已读
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 影响行数
     */
    int markAsRead(@Param("messageIds") List<Long> messageIds, @Param("userId") Long userId);
    
    /**
     * 删除消息（软删除）
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 影响行数
     */
    int deleteMessages(@Param("messageIds") List<Long> messageIds, @Param("userId") Long userId);
    
    /**
     * 根据消息ID获取消息详情
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 消息详情
     */
    SystemMessage getMessageById(@Param("messageId") Long messageId, @Param("userId") Long userId);
    
    /**
     * 获取用户最新的系统消息
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 最新消息列表
     */
    List<SystemMessage> getLatestMessages(@Param("userId") Long userId, @Param("limit") int limit);
    
    /**
     * 清理过期消息
     * @param days 保留天数
     * @return 清理数量
     */
    int cleanExpiredMessages(@Param("days") int days);
}
